/**
  ******************************************************************************
  * @file    uart_handler.h
  * @author  ashuai0110
  * @version V2.4
  * @date    2024-09-10
  * @brief   串口管理(使用帧间隔分帧或现有的分帧方法)
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git
  *
  ******************************************************************************
  */

#ifndef __UART_HANDLER_H
#define __UART_HANDLER_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common_include.h"
#include "ring_buffer.h"

/**
 * @addtogroup modules
 * @{
 */

/**
 * @addtogroup uart_handler
 * @{
 */

/* 宏定义---------------------------------------------------------------------*/

/* 类型定义-------------------------------------------------------------------*/
/**
 * @defgroup uart_handler_global_types uart handler global types
 * @{
 */

/**
  * @brief  串口发送前准备函数
  *
  * @note   如:使用中断发送时需使能发送相关中断/使用DMA发送时需配置使能DMA
  *
  * @param  enState : 0-关闭中断  1-开启中断
  *
  * @retval None
  */
typedef void (* uart_tx_en_fn_t)(uint8_t enState);

/** 
  * @brief  串口管理 structure definition
  */
typedef struct uart_handler {
    uint32_t recTimeout;        /*!< 接收超时时间ms */
    uint32_t recTimeoutCnt;     /*!< 接收超时计数temp */
    uint32_t targetFrameIntv;   /*!< 目标帧间隔ms */
    uint32_t curFrameIntv;      /*!< 当前帧间隔temp */
    
    ring_buffer_t txRingBuffer; /*!< 发送环形队列 */
    ring_buffer_t rxRingBuffer; /*!< 接收环形队列 */

    uart_tx_en_fn_t uartTxEnFn; /*!< 串口发送前准备函数 */
} uart_handler_t;

/**
 * @}
 */

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
/**
 * @addtogroup uart_handler_global_functions
 * @{
 */

void uart_hr_init(uart_handler_t *_uartHr, void *txBuf, uint32_t txLen, void *rxBuf, uint32_t rxLen, uart_tx_en_fn_t txEnFn, uint32_t frameIntv, uint32_t timeout);

uint8_t uart_hr_poll(uart_handler_t *_uartHr);

uint32_t uart_hr_read_rx_buf(uart_handler_t *_uartHr, void *pBuf, uint32_t len);
uint32_t uart_hr_write_rx_buf(uart_handler_t *_uartHr, void *pBuf, uint32_t len);

uint32_t uart_hr_read_tx_buf(uart_handler_t *_uartHr, void *pBuf, uint32_t len);
uint32_t uart_hr_write_tx_buf(uart_handler_t *_uartHr, void *pBuf, uint32_t len);

/* set/get interface */
void uart_hr_set_frame_intv(uart_handler_t *_uartHr, uint32_t frameIntv);
uint32_t uart_hr_get_frame_intv(uart_handler_t *_uartHr);
void uart_hr_set_rec_timeout(uart_handler_t *_uartHr, uint32_t timeout);
uint32_t uart_hr_get_rec_timeout(uart_handler_t *_uartHr);

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* uart_handler.h */
